/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.smart.hawk.model.caller;

import co.com.smart.connection.model.manager.JDBCResourceManager;
import co.com.smart.hawk.dto.*;
import co.com.smart.hawk.utilities.HawkSessionMgr;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Carlos Enaldo Ramos Hoyos
 * @Fecha 23/01/2017
 */
public class EmpresasCaller extends JDBCResourceManager{
    
    public EmpresasCaller(){
        super();
    }
    
    /**
     * Método para almacenar empresas
     * @author Carlos Enaldo Ramos Hoyos
     * @fecha 23/01/2017
     * @param empresa
     * @return EmpresaDTO
     */
    public EmpresaDTO grabarEmpresas(EmpresaDTO empresa)throws Throwable{
        EmpresaDTO returnEmpresa = new EmpresaDTO();
        Connection conn = null;
        CallableStatement call = null;
        UsuarioDTO user = (UsuarioDTO)HawkSessionMgr.getInstance().getSession("USER_SESSION");
        try{
            conn = getConnection();
            call = conn.prepareCall("{call GrabarEmpresa(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            call.setBigDecimal(1, empresa.getScempresa());
            call.setString(2, user.getCocodigo());
            call.setString(3, empresa.getCoempresa());
            call.setString(4, empresa.getDsempresa());
            call.setInt(5, empresa.getNmverificacion());
            call.setString(6, empresa.getDsnombrecorto());
            call.setString(7, empresa.getDsdireccion());
            call.setString(8, empresa.getDstelefono());
            call.setBigDecimal(9, empresa.getCiudad().getScciudad());
            call.setString(10, empresa.getDsemail());
            call.setBigDecimal(11, empresa.getTipoempresa().getScdatmaestro());
            call.setBigDecimal(12, empresa.getRepresentante().getSctercero());
            call.registerOutParameter(13, java.sql.Types.VARCHAR);
            call.registerOutParameter(14, java.sql.Types.VARCHAR);           
            call.executeUpdate();
            returnEmpresa.setDsmensaje(call.getString(13));
            returnEmpresa.setCodigo(call.getString(14));
        } catch (SQLException e) {
            throw  e;
        }finally{
            closeResources(conn, call);
        }
        return returnEmpresa;
    }
    
    /**
     * Método para consultar empresa
     * @author Carlos Enaldo Ramos Hoyos
     * @fecha 23/01/2017
     * @param empresa
     * @return EmpresaDTO
     */
    public EmpresaDTO consultarEmpresas(EmpresaDTO empresa)throws Throwable{
        Connection conn = null;
        CallableStatement call = null;
        ResultSet rs = null;
        try{
            conn = getConnection();
            call = conn.prepareCall("{call consultarEmpresas()}");
           // call.setString(1, empresa.getCoempresa());
            rs = call.executeQuery();
            
            if (rs!=null){
                while(rs.next()){
                    empresa = new EmpresaDTO();
                    DatosMaestrosDTO tipoEmpresa = new DatosMaestrosDTO();
                    CiudadDTO ciudad = new CiudadDTO();
                    DepartamentoDTO departamento = new DepartamentoDTO();
                    TerceroDTO representante = new TerceroDTO();    
                    DatosMaestrosDTO tipoDocumentoRepresentante = new DatosMaestrosDTO();
                    
                    empresa.setScempresa(rs.getBigDecimal("sm_scempresa"));
                    empresa.setCoempresa(rs.getString("sm_coempresa"));
                    empresa.setDsempresa(rs.getString("sm_dsempresa"));
                    empresa.setNmverificacion(rs.getInt("sm_nmverificacion"));
                    empresa.setDsnombrecorto(rs.getString("sm_dsnombrecorto"));
                    empresa.setDsdireccion(rs.getString("sm_dsdireccion"));
                    empresa.setDstelefono(rs.getString("sm_dstelefono"));
                    empresa.setDsemail(rs.getString("sm_dsemail"));
                    
                    tipoEmpresa.setScdatmaestro(rs.getBigDecimal("sm_sctipoempresa"));
                    tipoEmpresa.setDsdatmaestro(rs.getString("tipoempresa"));
                    
                    tipoDocumentoRepresentante.setScdatmaestro(rs.getBigDecimal("sm_sctipodocumento"));
                    representante.setSctercero(rs.getBigDecimal("sm_screpresentantelegal"));
                    representante.setCoidentificacion(rs.getString("sm_coidentificacion"));
                    representante.setNombrecontatenado(rs.getString("representantelegal"));
                    representante.setTipodocumento(tipoDocumentoRepresentante);
                            
                    departamento.setScdepartamento(rs.getBigDecimal("sm_scdepartamento"));
                    departamento.setDsdepartamento(rs.getString("sm_dsdepartamento"));
                    ciudad.setScciudad(rs.getBigDecimal("sm_scciudad"));
                    ciudad.setDepartamento(departamento);

                    empresa.setCiudad(ciudad);
                    empresa.setTipoempresa(tipoEmpresa);
                    empresa.setRepresentante(representante);
                }
            }
        } catch (SQLException e) {
            throw  e;
        }finally{
            closeResources(conn, call);
        }
        return empresa;
    }
        
    /**
     * Método para eliminar empresa
     * @author Carlos Enaldo Ramos Hoyos
     * @fecha 23/01/2017
     * @param empresa
     * @return EmpresaDTO
     */
    public EmpresaDTO eliminarEmpresas(EmpresaDTO empresa)throws Throwable{
        EmpresaDTO returnEmpresa = new EmpresaDTO();
        Connection conn = null;
        CallableStatement call = null;
        UsuarioDTO user = (UsuarioDTO)HawkSessionMgr.getInstance().getSession("USER_SESSION");
        try{
            conn = getConnection();
            call = conn.prepareCall("{call EliminarEmpresas(?)}");
            call.setString(1, empresa.getCoempresa());
            call.setString(2, user.getCocodigo());
            call.executeUpdate();
        } catch (SQLException e) {
            throw  e;
        }finally{
            closeResources(conn, call);
        }
        return returnEmpresa;
    }
    
    /**
     * Método para listar empresas
     * @author Carlos Enaldo Ramos Hoyos
     * @fecha 23/01/2017
     * @param empresa
     * @return List<EmpresaDTO>
     */
    public List<EmpresaDTO> listarEmpresas(EmpresaDTO filtros)throws Throwable{
        List<EmpresaDTO> returnEmpresa = new ArrayList<>();
        Connection conn = null;
        CallableStatement call = null;
        ResultSet rs = null;
        try{
            conn = getConnection();
            call = conn.prepareCall("{call consultarEmpresas()}");
           // call.setString(1, filtros.getCoempresa());
            rs = call.executeQuery();
            
            if (rs!=null){
                while(rs.next()){
                    EmpresaDTO empresa = new EmpresaDTO();
                    DatosMaestrosDTO tipoEmpresa = new DatosMaestrosDTO();
                    CiudadDTO ciudad = new CiudadDTO();
                    DepartamentoDTO departamento = new DepartamentoDTO();
                    TerceroDTO representante = new TerceroDTO();                              
                    
                    empresa.setScempresa(rs.getBigDecimal("sm_scempresa"));
                    empresa.setCoempresa(rs.getString("sm_coempresa"));
                    empresa.setDsempresa(rs.getString("sm_dsempresa"));
                    empresa.setNmverificacion(rs.getInt("sm_nmverificacion"));
                    empresa.setDsnombrecorto(rs.getString("sm_dsnombrecorto"));
                    empresa.setDsdireccion(rs.getString("sm_dsdireccion"));
                    empresa.setDstelefono(rs.getString("sm_dstelefono"));
                    empresa.setDsemail(rs.getString("sm_dsemail"));
                    
                    tipoEmpresa.setScdatmaestro(rs.getBigDecimal("sm_sctipoempresa"));
                    tipoEmpresa.setDsdatmaestro(rs.getString("tipoempresa"));
                    representante.setSctercero(rs.getBigDecimal("sm_screpresentantelegal"));
                    representante.setDsprimernombre(rs.getString("representantelegal"));
                    departamento.setScdepartamento(rs.getBigDecimal("sm_scdepartamento"));
                    ciudad.setScciudad(rs.getBigDecimal("sm_scciudad"));
                    ciudad.setDepartamento(departamento);
                    
                    empresa.setCiudad(ciudad);
                    empresa.setTipoempresa(tipoEmpresa);
                    empresa.setRepresentante(representante);

                    returnEmpresa.add(empresa);
                }
            }
        } catch (SQLException e) {
            throw  e;
        }finally{
            closeResources(conn, call, rs);
        }
        return returnEmpresa;
    }
}
